<html>
<head>
    <meta charset="utf-8">
    <title>Freemarker入门</title>
</head>
<body>

<#--  include 指令可以被多层嵌套包含 但是注意不要写成死循环 -->
<#--<#include "head.ftl"/>-->


<#-- 我只是一个注释，我不会有任何输出 插值表达式 -->
<#-- ${插值表达式} 是在模板文件中使用最多的 模板中要想填充数据 就必须使用 ${} 来进行占位
     ${} 中的值  必须和模型中的Map中的Key或者是Bean对象中的属性名称保存一致
    <#assign >  是在模型中声明一个变量 声明的变量可以直接在插值表达式中使用
                因为模板中的数据大多来自于数据模型 所以这个使用不多

-->

<#--
    freemarker的API
    必须要掌握的脚本:
    1. 插值表达式  ${变量名称} 如果变量在数据模型中有 在模板中也有 模板中的优先级更高
    2. 定义变量  <#assign 变量名称=变量值>
    3. 对象取值  如果变量是个JSON对象 ${变量名称.属性名称}
    4. IF分支语句  <#if 表达式>  表达式的结果必须是bool类型的  如果<#if 变量名称>  变量的类型也必须是个bool类型的  <#elseif 表达式>
        <#if 表达式>
            处理内容
        <#elseif 表达>
            处理内容
        <#else >
            处理内容
        </#if>
    5. List集合的遍历 <#list 要遍历的集合变量名称 as 遍历出来的每个元素的临时变量名>



-->


<br>
<hr>
<hr>

<#if success>
    加载页面~
</#if>

<br>
<#-- 通常模型中的值都是有Java传递过来的 在模型中声明变量用的不多 -->
<#--<#assign linkman="周先生">-->
联系人：${linkman}, ${student.age}


<br>

<#-- Map集合
     如果你使用<#assign>声明map的时候要注意 key必须要带引号
     我们通过${JSON对象.key}
-->
<#assign info={"mobile":"13812345678","address":'北京市昌平区'} >
电话：${info.mobile} 地址：${info.address}
<br>
<br>
<hr>
<hr>


<#--
      <#if> 指令必须有闭合
      这个指令的条件可以是一个结果为boolean类型的表达式
      如果模板中声明的变量和数据模型中声明的变量冲突了  freemarker会使用模板中声明的这个变量
      就近原则
-->
<#assign success=false>
<#if success>
    你已通过实名认证
<#else>
    你未通过实名认证
</#if>
<br>
<br>
<hr>
<hr>


<#--
    Map
      goodsList
         map , map , map
    goodsList 是数据模型中的名称
    as 是个关键字
    goods 是每次遍历出来的的临时遍历 可以任意起名称

    v-for xxx in goodsList
-->
<#--<#list goodsList as goods>
    商品名称： ${goods.name} 价格：${goods.price} 索引:${goods_index}<br>
</#list>-->
<br>
<br>
<br>
<#--  List<Setmeal> -->
<br>

<#list ["winter", "spring", "summer", "autumn"] as x>
    ${x}===
</#list>
<br>
<br>
<br>
<hr>
<hr>

<#-------------------------------练习---------------------------------->
字符串输出:
<#assign name="zhangsan"/>
<br><br>
hello ${name} <br>
${"hello"}${name}<br>
${"Hello ${name} !"} <br>
${"Hello " + name + " !"}<br>
<br>
<br>
<br>
<hr>
<hr>

<#--
    如果字符串中包含转义字符 插值表达式在取值的时候会自动识别转义字符
    如果不想自动转义，可以在字符串前加一个r
-->
<#assign cname=r"特殊字符完成输出(http:\\www.itheima.com)">
${cname}
<br>
<br>
<br>
<hr>
<hr>

<#-- [1] -->

字符串截取 ：<br>
<#--a-->
通过下标直接获取下标对应的字母：${name[2]}<br>
<#--zhangs-->
起点下标..结尾下标截取字符串：${name[0..5]}

<br>
<br>
<br>
<hr>
<hr>

算数运算：<br>
<#assign number1 = 10>
<#assign number2 = 5>
"+" : ${number1 + number2}<br>
"－" : ${number1 - number2}<br>
"*" : ${number1 * number2}<br>
"/" : ${number1 / number2}<br>
"%" : ${number1 % number2}<br>
<br>
<br>
<br>
<hr>
<hr>

比较运算符：<br>
<#-- gte 大于等于  lt 小于 -->
<#if number1 + number2 gte 20 || number1 - number2 lt 2>
    number1 * number2 : ${number1 * number2}
<#else>
    number1 / number2  : ${number1 / number2}
</#if>
<br>
<br>
<br>
<br>
<hr>

<#assign var = 666>
<#if var == 999>
    var = 999
<#elseif var == 888>
    var = 888
<#else >
    var = ${var}
</#if>
<br>
<br>
<br>
<hr>


内建函数：<br>
<#assign data = "abcd1234">
第一个字母大写：${data?cap_first}
所有字母小写：${data?lower_case}
所有字母大写：${data?upper_case}
<br>
<br>
<br>
<hr>

<#assign floatData = 12.84><br>
数值取整数：${floatData?int}<br>
获取集合的长度：${goodsList?size}<br>
时间格式化：<br>
<#--${dTime} 如果我们的模型是日期类型 必须要指定日期格式 -->
${dTime?date}<br>
${dTime?time}<br>
${dTime?datetime}<br>
${dTime?string("yyyy/MM/dd")}
<br>
<br>
<br>
<br>
<hr>

空判断和对象集合：<br>
<#--  ??判断是否为null -->
<#if goodsList??>
    <#list goodsList as goods >
        ${goods.name} - ${goods.price}<br>
    </#list>
<#else>
    goodsList为空
</#if>

</body>
</html>
